#ifndef DATA_COLLECTOR_H
#define DATA_COLLECTOR_H

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/flow-monitor-module.h"
#include "data_manager.h"
#include "node_manager.h"
#include "link_manager.h"
#include <string>
#include <map>
#include <vector>

namespace ns3 {

/**
 * @brief 流量统计信息结构
 */
struct FlowStats {
  uint32_t flowId;              ///< 流ID
  uint32_t sourceNodeId;        ///< 源节点ID
  uint32_t destinationNodeId;   ///< 目标节点ID
  std::string nodeType;         ///< 节点类型
  double distance;              ///< 距离
  uint32_t txPackets;           ///< 发送的数据包数量
  uint32_t rxPackets;           ///< 接收的数据包数量
  uint32_t lostPackets;         ///< 丢失的数据包数量
  double packetLossRatio;       ///< 丢包率
  double throughput;            ///< 吞吐量 (bits/s)
  double meanDelay;             ///< 平均延迟 (s)
  double meanJitter;            ///< 平均抖动 (s)
  bool connected;               ///< 是否成功连接
};

/**
 * @brief 车辆时间点性能数据结构
 */
struct VehicleTimePointData {
  double time;                       ///< 时间点
  Vector position;                   ///< 车辆位置
  double speed;                      ///< 车辆速度
  std::vector<FlowStats> flowStats;  ///< 此时间点的流量统计信息
};

/**
 * @brief 数据收集器类，负责收集和保存性能数据
 */
class DataCollector 
{
public:
  /**
   * @brief 构造函数
   */
  DataCollector();
  
  /**
   * @brief 析构函数
   */
  ~DataCollector();
  
  /**
   * @brief 初始化数据收集器
   * @param dataManager 数据管理器
   * @param nodeManager 节点管理器
   * @param linkManager 链接管理器
   * @return 初始化是否成功
   */
  bool Initialize(const DataManager& dataManager, 
                  const NodeManager& nodeManager, 
                  const LinkManager& linkManager);
  
  /**
   * @brief 设置流量监控器
   * @return 设置是否成功
   */
  bool SetupFlowMonitor();
  
  /**
   * @brief 收集性能数据
   * @return 收集是否成功
   */
  bool CollectData();
  
  /**
   * @brief 保存性能数据到文件
   * @param vehicleId 车辆ID
   * @param outputDir 输出目录
   * @return 保存是否成功
   */
  bool SaveData(uint32_t vehicleId, const std::string& outputDir);
  
  /**
   * @brief 重置数据收集器
   */
  void Reset();
  
  /**
   * @brief 为车辆轨迹每个时间点生成性能数据
   * @param vehicleId 车辆ID
   * @param trajectory 车辆轨迹数据
   */
  void GenerateTimePointData(uint32_t vehicleId, const std::vector<VehicleData>& trajectory);

private:
  /**
   * @brief 生成流量统计字符串
   * @param stats 流量统计信息
   * @return 格式化的统计信息字符串
   */
  std::string GenerateStatsString(const FlowStats& stats) const;
  
  /**
   * @brief 识别流中的节点
   * @param flowId 流ID
   * @param sourceAddress 源地址
   * @param destinationAddress 目标地址
   * @param stats 待填充的流量统计信息
   * @return 识别是否成功
   */
  bool IdentifyFlowNodes(uint32_t flowId, 
                         Ipv4Address sourceAddress, 
                         Ipv4Address destinationAddress,
                         FlowStats& stats) const;
  
  /**
   * @brief 计算车辆与目标节点之间的距离
   * @param vehiclePos 车辆位置
   * @param nodeType 节点类型
   * @param nodeId 节点ID
   * @return 距离（米）
   */
  double CalculateDistance(const Vector& vehiclePos, const std::string& nodeType, uint32_t nodeId) const;

private:
  const DataManager* m_dataManager;      ///< 数据管理器引用
  const NodeManager* m_nodeManager;      ///< 节点管理器引用
  const LinkManager* m_linkManager;      ///< 链接管理器引用
  
  Ptr<FlowMonitor> m_flowMonitor;        ///< 流量监控器
  FlowMonitorHelper m_flowMonitorHelper; ///< 流量监控助手
  
  mutable std::vector<FlowStats> m_flowStats;    ///< 流量统计信息
  std::vector<VehicleTimePointData> m_vehicleTimePoints; ///< 车辆时间点性能数据
};

} // namespace ns3

#endif // DATA_COLLECTOR_H
